﻿#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

//getLuckyPacket:从当前位置开始搜索符合要求的组合，一直搜索到最后一个位置结束
//v : 袋子中的所有球
//n : 球的总数
//pos : 当前搜索的位置
//sum : 到目前位置的累加和
//mult : 到目前位置的累积值

int getLuckyPacket(int n, vector<int> v, int pos, int sum, int mul)
{

    int count = 0;
    //循环，搜索以位置i开始所有可能的组合
    for (int i = pos; i < n; i++)
    {
        sum += v[i];
        mul *= v[i];
        if (sum > mul)
        {
            //找到符合要求的组合，加1，继续累加后续的值，看是否有符合要求的集合
            count++;
            count += getLuckyPacket(n, v, i + 1, sum, mul);
        }
        else if (v[i] == 1)
        {
            //如何不符合要求，且当前元素值为1，则继续向后搜索
            count += getLuckyPacket(n, v, i + 1, sum, mul);
        }
        else
        {
            ////如何sum小于mult,则后面就没有符合要求的组合了
            break;
        }

        //要搜索下一个位置之前，首先恢复sum和mult
        sum -= v[i];
        mul /= v[i];

        ////数字相同的球，没有什么区别，都只能算一个组合，所以直接跳过
        while (i < n - 1 && v[i] == v[i + 1])
        {
            i++;
        }
    }
    return count;
}

int main()
{
    int n;
    while (cin >> n)
    {
        vector<int>  v(n, 0);
        for (int i = 0; i < n; i++)
        {
            cin >> v[i];
        }
        sort(v.begin(), v.end());

        int count = getLuckyPacket(n, v, 0, 0, 1);
        cout << count << endl;
    }
    return 0;
}